package top.lshaci.learning.jvm.string;

import org.junit.Test;

/**
 * StringInternTest
 *
 * @author lshaci
 * @date 2020/7/16 16:46
 * @since 1.0.0
 */
public class StringInternTest {

    /**
     * 如何保证变量s指向的是字符串常量池中的数据？
     *
     * 一、String s = "hello world";
     * 二、String s = new String("hello world").intern();
     *
     * @param args
     */
    public static void main(String[] args) {
        // 创建了两个对象  new  和  常量池中的 "1"
        String s = new String("1");
        s.intern(); // 调用此方法前，字符串常量池中已经有 "1" 了
        String s2 = "1";
        System.err.println(s == s2); // false

        /**
         * 相当于：String s3 = new StringBuilder("11").toString();
         * 在字符串常量池中没有 "11"
          */
        String s3 = new String("1") + new String("1");
        /**
         * 在字符串常量池中生成 "11"
         * jdk6：创建了一个新的对象"11"，也就有新的地址
         * jdk8：此时常量池中并没有创建"11"，而是创建一个指向堆空间new String("11")
          */
        s3.intern();
        String s4 = "11";  // 为字符串常量池中的地址
        System.err.println(s3 == s4); // true (jdk6 -> false)
    }

    @Test
    public void test() {
        String s1 = new String("1");
        s1.intern();
        String s2 = "1";
        System.err.println(s1 == s2); // false

        String s3 = new String("1") + new String("1");
        s3.intern();
        String s4 = "11";
        System.err.println(s3 == s4); // false
    }
}
